package metier;

import java.io.Serializable;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Candidature implements Serializable {

	private static final long serialVersionUID = 4133791628046745056L;
	
	private IdentifiantCandidature identifiantCandidature = new IdentifiantCandidature();
	private Date validationEtudiant = null;
	private Date validationDepartement = null;
	private Date validationEntreprise = null;
	
	private void testerExceptionEtudiant(Etudiant etudiant)
			throws Exception {
		if (etudiant == null)
			throw new Exception("L'étudiant ne doit pas être null");
	}
	
	private void testerExceptionStage(Stage stage)
			throws Exception {
		if (stage == null)
			throw new Exception("Le stage ne doit pas être null");
	}
	
	public Candidature(Etudiant etudiant, Stage stage) throws Exception {
		
		super();
		
		testerExceptionEtudiant(etudiant);
		testerExceptionStage(stage);
		
		this.identifiantCandidature = new IdentifiantCandidature(etudiant, stage);
	}

	/**
	 * Bien qu'illogique avec le mod�le UML, ce constructeur est obligatoire pour respecter la convention
	 * des JavaBean utilisŽe par certains frameworks (Struts, Hibernate, ...)
	 */
	public Candidature()
	{	
	}

	public IdentifiantCandidature getIdentifiantCandidature() {
		return identifiantCandidature;
	}

	public void setIdentifiantCandidature(
			IdentifiantCandidature identifiantCandidature) {
		this.identifiantCandidature = identifiantCandidature;
	}

	public Etudiant getEtudiant() {
		return identifiantCandidature.getEtudiant();
	}

	public void setEtudiant(Etudiant etudiant) {
		this.identifiantCandidature.setEtudiant(etudiant);
	}

	public Stage getStage() {
		return identifiantCandidature.getStage();
	}

	public void setStage(Stage stage) {
		this.identifiantCandidature.setStage(stage);
	}

	public Date getValidationEtudiant() {
		return validationEtudiant;
	}

	public void setValidationEtudiant(Date validationEtudiant) {
		this.validationEtudiant = validationEtudiant;
	}

	public Date getValidationDepartement() {
		return validationDepartement;
	}

	public void setValidationDepartement(Date validationDepartement) {
		this.validationDepartement = validationDepartement;
	}

	public Date getValidationEntreprise() {
		return validationEntreprise;
	}

	public void setValidationEntreprise(Date validationEntreprise) {
		this.validationEntreprise = validationEntreprise;
	}

	@Override
	public String toString() {
		return "Candidature [etudiant=" + identifiantCandidature.getEtudiant().getIdEtudiant() + ", stage=" + identifiantCandidature.getStage()
				+ ", validationEtudiant=" + validationEtudiant
				+ ", validationDepartement=" + validationDepartement
				+ ", validationEntreprise=" + validationEntreprise + "]";
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		//result = prime * result
			//	+ ((etudiant == null) ? 0 : etudiant.hashCode());
		//result = prime * result + ((stage == null) ? 0 : stage.hashCode());
		result = prime
				* result
				+ ((validationDepartement == null) ? 0 : validationDepartement
						.hashCode());
		result = prime
				* result
				+ ((validationEntreprise == null) ? 0 : validationEntreprise
						.hashCode());
		result = prime
				* result
				+ ((validationEtudiant == null) ? 0 : validationEtudiant
						.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj)
	{
		//Nécessaire pour comparer les dates sans tenir compte des heures
		DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");		
		
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Candidature other = (Candidature) obj;
		if (this.getEtudiant() == null) {
			if (other.getEtudiant() != null)
				return false;
		} else if (!getEtudiant().equals(other.getEtudiant()))
			return false;
		if (getStage() == null) {
			if (other.getStage() != null)
				return false;
		} else if (!getStage().equals(other.getStage()))
			return false;
		if (validationDepartement == null) {
			if (other.validationDepartement != null)
				return false;
		} else if (!dateFormat.format(validationDepartement).equals(dateFormat.format(other.validationDepartement)))
			return false;
		if (validationEntreprise == null) {
			if (other.validationEntreprise != null)
				return false;
		} else if (!dateFormat.format(validationEntreprise).equals(dateFormat.format(other.validationEntreprise)))
			return false;
		if (validationEtudiant == null) {
			if (other.validationEtudiant != null)
				return false;
		} else if (!dateFormat.format(validationEtudiant).equals(dateFormat.format(other.validationEtudiant)))
			return false;
		return true;
	}
	
	
}
